Применение специализированных библиотек.

Keras — открытая нейросетевая библиотека, написанная на языке Python. Она представляет собой надстройку над фреймворками Deeplearning4j, TensorFlow и Theano. Библиотека  нацелена на оперативную работу с сетями глубинного обучения, при этом спроектирована так, чтобы быть компактной, модульной и расширяемой.

 Выполните программу для распознавания рукописных цифр в среде Google Colab — это бесплатный облачный сервис на основе Jupyter Notebook. Google Colab предоставляет всё необходимое для машинного обучения прямо в браузере, даёт бесплатный доступ к невероятно быстрым GPU и TPU.

Перед созданием программы в Google Colab, установите Runtime->Change runtime type->GPU.

 Выполните задания, предлагаемые в текстовый ячейках. Ответы на задания разместите в дополнительных текстовых ячейках. В качестве ответа на задание необходимо прислать: файл с кодом программы и ответами на задания, созданное изображение и результат распознавания (в ipynb).

__________________________
mnist_keras.ipynb
__________________________

{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "9zDo5xdHqsJP"
   },
   "source": [
    "Эту строку вы можете раскомментировать если будет необходимо."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "CUOj0BUGqumi"
   },
   "outputs": [],
   "source": [
    "#pip install --force-reinstall tensorflow"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "MWXMtXo-rDV5"
   },
   "source": [
    "Импорт библиотек"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "4ED3XuK8rmsc"
   },
   "source": [
    "Задание:  Используя документацию библиотеки, прочитайте о назначении каждого модуля. Зафиксируйте эти сведения в дополнительной текстовой ячейке. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "4QdZyO5duJ_f"
   },
   "outputs": [],
   "source": [
    "from keras.layers import Dense\n",
    "from keras.models import Sequential\n",
    "from keras.datasets import mnist\n",
    "from keras import utils\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "zDksPVRvsIPf"
   },
   "source": [
    "Инициализация наборов данных"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "H-DnxFpGu_ze"
   },
   "outputs": [],
   "source": [
    "(X_train, y_train), (X_test, y_test) = mnist.load_data()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "kGNYAy1Asg8s"
   },
   "source": [
    "Изменение форматов  данных"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "f35LxS1ktZ5K"
   },
   "source": [
    "Задание: Используя дополнительные инструкции, определите исходный формат данных. Попытайтесь определить какие преобразования и для чего производятся в результате выполнения нижеприведённого кода."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "nPRVjqEjvURw"
   },
   "outputs": [],
   "source": [
    "X_train = X_train.reshape(60000, 784) \n",
    "X_test = X_test.reshape(10000, 784)\n",
    "\n",
    "X_train = X_train.astype('float32') \n",
    "X_test = X_test.astype('float32') \n",
    "X_train /= 255 \n",
    "X_test /= 255"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "fymXxZvuthm1"
   },
   "source": [
    "Пример выходных данных"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "8lhVjEyCtdBb"
   },
   "outputs": [],
   "source": [
    "n = 100 \n",
    "print(y_train[n])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "fhibXT1kv0QF"
   },
   "source": [
    "Преобразуем метки в формат one hot encoding"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "Tpb-Us4Rv1l1"
   },
   "outputs": [],
   "source": [
    "Y_train = utils.to_categorical(y_train, 10) \n",
    "Y_test = utils.to_categorical(y_test, 10)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "QNAoO9zzwGHv"
   },
   "source": [
    "Правильный ответ в формате one hot encoding"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "QTrwsxBtwHFn"
   },
   "outputs": [],
   "source": [
    "print(Y_train[n])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "dekC-RMmwPUR"
   },
   "source": [
    "Создаем нейронную сеть"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "iCaDAZTOwQBx"
   },
   "outputs": [],
   "source": [
    "model = Sequential()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "OAApNuaSwWZZ"
   },
   "source": [
    "Добавляем уровни сети\n",
    "\n",
    "Создаем нейронную сеть:"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Задание: Используя документацию, определите основные параметры метода add. Запишите полученные сведения в дополнительной текстовой ячейке. Опишите топологию создаваемой в программе нейронной сети и ее особенности (используемые функции активации, …)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "F4HnrDHmwYWz"
   },
   "outputs": [],
   "source": [
    "model.add(Dense(784, input_dim=784, activation=\"relu\"))\n",
    "model.add(Dense(200, input_dim=784, activation=\"relu\"))\n",
    "model.add(Dense(10, activation=\"softmax\"))\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "2vK7Wuoxwy2G"
   },
   "source": [
    "Компилируем сеть"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "AIN2emqUuFoO"
   },
   "source": [
    "Задание: Используя справочный материал, поясните значение каждого параметра метода compile"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "nvZy5_DbwznW"
   },
   "outputs": [],
   "source": [
    "model.compile(loss=\"categorical_crossentropy\", optimizer=\"adam\", metrics=[\"accuracy\"]) \n",
    "print(model.summary())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "wQ5YXzl7xDlB"
   },
   "source": [
    "Обучаем нейронную сеть\n",
    "\n",
    "Для обучения нейронной сети будем использовать обучающую выборку X_train и правильные ответы для нее Y_train.\n",
    "\n",
    "Параметр bath_size определяет количество образцов, которые будут одновременно использованы для обучения сети. Этот параметр оказывает влияние на алгоритм обучения. \n",
    "\n",
    "Параметр epochs отвечает за число эпох обучения. \n",
    "\n",
    "Параметр validation_split отвечает за долю первоначальных исходных данных, которые пойдут для тестирования обученной сети. Остальная часть исходных данных пойдет для обучения сети.\n",
    "\n",
    "Параметр verbose отвечает за настройку алгоритма обучения сети. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "S-exprpqxEig"
   },
   "outputs": [],
   "source": [
    "history = model.fit(X_train, Y_train, batch_size=200, epochs=25, validation_split=0.2, verbose=2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "4Z_Js3UIzPKX"
   },
   "source": [
    "Качество работы сети на тестовых данных"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "M9gu8tw-zRIn"
   },
   "outputs": [],
   "source": [
    "scores = model.evaluate(X_test, Y_test, verbose=0) \n",
    "print(\"Точность работы на тестовых данных: %.2f%%\" % (scores[1]*100))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "4AuEAIQGzeEp"
   },
   "source": [
    "Задание: Используя справочный материал, изучите атрибуты объекта History. Приведите их краткое описание."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "r14CA3cezewy"
   },
   "outputs": [],
   "source": [
    "history_dict = history.history"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "19bkeetkvDNx"
   },
   "source": [
    "Для построения графика качества обучения используется библиотека matplotlib"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "TjxyMkOYL76d"
   },
   "outputs": [],
   "source": [
    "\n",
    "plt.plot(history.history['accuracy'], label='train')\n",
    "plt.plot(history.history['val_accuracy'], label='test')\n",
    "plt.legend()\n",
    "plt.xlabel('Epochs') \n",
    "plt.ylabel('Accuracy') \n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "Gz9GybHtvt49"
   },
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "C1Ukdw6awR0W"
   },
   "source": [
    "Теперь можно распознать рукописную цифру из набора данных, используя обученную сеть: "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "1Wj8zpBC28d_"
   },
   "outputs": [],
   "source": [
    "n_rec = 488"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "9sQEVexS2_eY"
   },
   "outputs": [],
   "source": [
    "x = X_test[n_rec] \n",
    "x = np.expand_dims(x, axis=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "-SOyn80k3FMI"
   },
   "outputs": [],
   "source": [
    "prediction = model.predict(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "oBozSgH63HUh"
   },
   "outputs": [],
   "source": [
    "print(prediction)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "7jGPklvR3J1R"
   },
   "outputs": [],
   "source": [
    "prediction = np.argmax(prediction) \n",
    "print(prediction)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "6V3BoZhP3RAZ"
   },
   "outputs": [],
   "source": [
    "print(y_test[n_rec])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "Jjp-PcuwxdFj"
   },
   "source": [
    "Используя графический редактор paint создайте изображение рукописной цифры. Используйте базовый инструмент «Карандаш». Размер изображения должен быть 28 на 28 пикселей или близкий к этому, поскольку при преобразовании изображение сильно искажается.\n",
    "Сохраните изображение в формате jpeg и загрузите на свой google-диск.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "PxPBhmngxjqU"
   },
   "source": [
    "Подключение google-диска"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "Mm32uCeAGjsz"
   },
   "outputs": [],
   "source": [
    "from google.colab import drive\n",
    "drive.mount('/gdrive')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "ce0AsEUdyLlj"
   },
   "source": [
    "Перейдите по ссылке, выберите свой аккаунт google и нажмите «разрешить». Далее следуйте инструкциям. Скопируйте код, перейдите в приложение и вставьте его в нужное поле: "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "SaUYzo_CyVDD"
   },
   "source": [
    "Проверка google-диска ..."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "G62Oh_FCASyr"
   },
   "outputs": [],
   "source": [
    "!ls \"/gdrive/My Drive\""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "VREfJoSfyYf0"
   },
   "source": [
    "Установка библиотек для обработки изображения "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "nsDeTRU3AZyj"
   },
   "outputs": [],
   "source": [
    "!pip install opencv-python\n",
    "!pip install scipy\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "aasTwVZ4ypwS"
   },
   "source": [
    "Импорт библиотек для обработки изображения.  Загрузка и обработка изображения с google-диска"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "nYnaBDYoAdm7"
   },
   "outputs": [],
   "source": [
    "import cv2\n",
    "import scipy.misc\n",
    "import matplotlib.pyplot as plt\n",
    "img=cv2.imread(\"/gdrive/My Drive/1/img4.jpg\", cv2.IMREAD_UNCHANGED)\n",
    "#resolution = (28, 28)\n",
    "#img = cv2.resize(img, resolution)\n",
    "img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)\n",
    "img_data = (255.0-img.reshape(-1))/255\n",
    "plt.imshow(img_data.reshape(28,28))\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "hNA5GufTzNpu"
   },
   "source": [
    "Задание: Поясните, какого рода преобразования изображения были произведены, для чего"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "SyY8jYr9AkR0"
   },
   "outputs": [],
   "source": [
    "x=np.expand_dims(img_data,axis=0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "ak2xWH4xzRXW"
   },
   "source": [
    "Используя обученную сеть, пробуем распознать вновь созданное изображение "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "YMib4y7-AnSV"
   },
   "outputs": [],
   "source": [
    "prediction = model.predict(x)\n",
    "print(prediction)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "zRaJ62pNzfQS"
   },
   "source": [
    "Оцените результат"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "z3jw3vwrA13F"
   },
   "outputs": [],
   "source": [
    "prediction = np.argmax(prediction)\n",
    "print(prediction)\n"
   ]
  }
 ],
 "metadata": {
  "accelerator": "TPU",
  "colab": {
   "name": "mnist_keras.ipynb",
   "provenance": []
  },
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
